#include "user.pb.h"
#include "mprpcapplication.h"
#include "mprpcchannel.h"

#include <iostream>

int main(int argc, char **argv)
{
    // 整个程序启动以后，想使用 mprpc 框架来享受 rpc 服务调用，一定要先调用框架的初始化函数（只初始化一次）
    MprpcApplication::Init(argc, argv);

    // 演示调用远程发布的 rpc 方法 Login
    fixbug::UserServiceRpc_Stub stub(new MprpcChannel());
    
    // rpc 方法的请求参数
    fixbug::LoginRequest requeset;
    requeset.set_name("FFF");
    requeset.set_pwd("fff");
    // rpc 方法的响应
    fixbug::LoginResponse response;
    // 发起 rpc 方法的调用，同步的 rpc 调用过程 Login底层就是MprpcChannel::CallMethod方法的调用
    stub.Login(nullptr, &requeset, &response, nullptr);  // RpcChannel->RpcChannel::CallMethod 集中来做所有 rpc 方法调用的参数序列化和网络发送

    // 一次 rpc 调用完成，读调用的结果
    if(response.result().errcode() == 0)  // 这个数据格式是约定的
    {
        std::cout << "rpc login response success: " << response.success() << std::endl;
    }
    else
    {
        std::cout << "rpc login response error: " << response.result().errmsg() << std::endl;
    }

    // ========================================

    // 演示调用远程发布的 rpc 方法 Register
    fixbug::RegisterRequest req;
    req.set_id(2000);
    req.set_name("YYY");
    req.set_pwd("yyy");

    fixbug::RegisterResponse res;  // 定义响应
    stub.Register(nullptr, &req, &res, nullptr);  // 同步方式发起 rpc 调用请求，等待返回结果
    
    // 一次 rpc 调用完成，读调用的结果
    if(res.result().errcode() == 0)  // 这个数据格式是约定的
    {
        std::cout << "rpc register response success: " << response.success() << std::endl;
    }
    else
    {
        std::cout << "rpc register response error: " << response.result().errmsg() << std::endl;
    }

    return 0;
}